## 7 Signal Handling (`signal.h`)

A signal is an event that interrupts the normal flow of control in your program. Your operating environment normally defines the full set of signals available (see `sys/signal.h`), as well as the default means of dealing with them—typically, either printing an error message and aborting your program, or ignoring the signal.

All systems support at least the following signals:

`SIGABRT`
  Abnormal termination of a program; raised by the `abort` function.
`SIGFPE`
  A domain error in arithmetic, such as overflow, or division by zero.
`SIGILL`
  Attempt to execute as a function data that is not executable.
`SIGINT`
  Interrupt; an interactive attention signal.
`SIGSEGV`
  An attempt to access a memory location that is not available.
`SIGTERM`
  A request that your program end execution.

Two functions are available for dealing with asynchronous signals—one to allow your program to send signals to itself (this is called raising a signal), and one to specify subroutines (called handlers to handle particular signals that you anticipate may occur—whether raised by your own program or the operating environment.

To support these functions, `signal.h` defines three macros:

`SIG_DFL`
  Used with the `signal` function in place of a pointer to a handler subroutine, to select the operating environment's default handling of a signal.
`SIG_IGN`
  Used with the `signal` function in place of a pointer to a handler, to ignore a particular signal.
`SIG_ERR`
  Returned by the `signal` function in place of a pointer to a handler, to indicate that your request to set up a handler could not be honored for some reason.

`signal.h` also defines an integral type, `sig_atomic_t`. This type is not used in any function declarations; it exists only to allow your signal handlers to declare a static storage location where they may store a signal value. (Static storage is not otherwise reliable from signal handlers.)